gsk: Add GskRenderer::clear_tree
authorEmmanuele Bassi <ebassi@gnome.org>
Tue, 26 Apr 2016 13:22:25 +0000 (14:22 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:29:34 +0000 (11:29 +0100)
We need a way to clear eventual caches inside GskRenderer subclasses if
the root node has changed.

gsk/gskrenderer.c
gsk/gskrendererprivate.h

index cf90e382d9c328e8eab068f8e8c9807e4ff2de1e..3a84fc9547b881016ee2703083c754f918a99617 100644 (file)
@@ -135,6 +135,12 @@ gsk_renderer_real_validate_tree (GskRenderer *self,
 {
 }
 
+static void
+gsk_renderer_real_clear_tree (GskRenderer *self,
+                              GskRenderNode *old_root)
+{
+}
+
 static void
 gsk_renderer_dispose (GObject *gobject)
 {
@@ -294,6 +300,7 @@ gsk_renderer_class_init (GskRendererClass *klass)
   klass->resize_viewport = gsk_renderer_real_resize_viewport;
   klass->update = gsk_renderer_real_update;
   klass->validate_tree = gsk_renderer_real_validate_tree;
+  klass->clear_tree = gsk_renderer_real_clear_tree;
   klass->render = gsk_renderer_real_render;
 
   gobject_class->constructed = gsk_renderer_constructed;
@@ -727,6 +734,7 @@ gsk_renderer_set_root_node (GskRenderer   *renderer,
       if (old_root != NULL)
         {
           gsk_render_node_set_invalidate_func (old_root, NULL, NULL, NULL);
+          gsk_renderer_clear_tree (renderer, old_root);
           g_object_unref (old_root);
         }
 
@@ -1135,6 +1143,13 @@ gsk_renderer_maybe_update (GskRenderer *renderer)
     }
 }
 
+void
+gsk_renderer_clear_tree (GskRenderer   *renderer,
+                         GskRenderNode *old_root)
+{
+  GSK_RENDERER_GET_CLASS (renderer)->clear_tree (renderer, old_root);
+}
+
 /*< private >
  * gsk_renderer_maybe_validate_tree:
  * @renderer: a #GskRenderer
index 404502c5be1cce9c0d9475c73a7d207e98466d23..2237c86ed130f65a1b91552d6a33adf59c2c5cdb 100644 (file)
@@ -46,12 +46,17 @@ struct _GskRendererClass
                    const graphene_matrix_t *projection);
   void (* validate_tree) (GskRenderer *renderer,
                           GskRenderNode *root);
+  void (* clear_tree) (GskRenderer *renderer,
+                       GskRenderNode *old_root);
   void (* clear) (GskRenderer *renderer);
   void (* render) (GskRenderer *renderer);
 };
 
 gboolean gsk_renderer_is_realized (GskRenderer *renderer);
 
+void gsk_renderer_clear_tree (GskRenderer *renderer,
+                              GskRenderNode *old_root);
+
 void gsk_renderer_maybe_resize_viewport (GskRenderer *renderer);
 void gsk_renderer_maybe_update (GskRenderer *renderer);
 void gsk_renderer_maybe_validate_tree (GskRenderer *renderer);